﻿<!DOCTYPE html>
<html>

<head>
	<meta charset=utf-8>
	<title>Effekseer For Cocos2d-x</title>
	<link href="base.css" rel="stylesheet" type="text/css" />
</head>

<body>
	<div class="main">
		<h1>Effekseer For Cocos2d-x</h1>
		
		<h2>概要</h2>

		<p>
		Effekseerは簡単に綺麗なパーティクルエフェクトを作成できるツールです。このライブラリはEffekseerで作成されたパーティクルエフェクトをCocos2d-xで再生できるようにします。
		このドキュメントではEffekseerとCocos2d-xの連携について説明します。
		ライブラリは複数のソースコードのファイルで構成されており、そのソースコードのファイルをCocos2d-xのプロジェクトに追加することでインストールできます。
		</p>

		<p>
		対応環境は以下のようになります。
		</p>

		<table>
			<tr>
				<td>Windows</td>
				<td>OK</td>
			</tr>

			<tr>
				<td>Mac OS X</td>
				<td>OK</td>
			</tr>

			<tr>
				<td>Linux</td>
				<td>Unknown</td>
			</tr>

			<tr>
				<td>iOS</td>
				<td>OK</td>
			</tr>

			<tr>
				<td>Android</td>
				<td>OK</td>
			</tr>

			<tr>
				<td>WindowsPhone</td>
				<td>Unknown</td>
			</tr>

		</table>

		<div align="Center">
			<img src="Top.png">
		</div>

		<h2>重要</h2>
		<p>
		Cocos2d-x v4とMacOSXで使用するためにはCocos2d-x Effekseer ブランチが必要です。
		</p>

		<a href="https://github.com/effekseer/cocos2d-x/tree/cocos2d-x-effekseer">Cocos2d-x Effekseer ブランチ</a>

		<h2>インストール方法(バージョン4)</h2>

		<p>
		<b>Players/Cocos2d-x_v4</b>をCocos2d-xのプロジェクトにコピーしてください。
		</p>

		<p>
		下記のようにコードをCMakeLists.txtに追加してください。
		</p>

<pre>
add_subdirectory(Cocos2d-x_v4)
target_link_libraries(${APP_NAME} EffekseerForCocos2d-x)
</pre>

		<h2>インストール方法(バージョン3)</h2>
		<p>
		<b>Players/Cocos2d-x_v3</b>ディレクトリに以下のファイルが存在します。
		</p>

<ul>
<li>Effekseer.cpp</li>
<li>Effekseer.h</li>
<li>EffekseerNative.cpp</li>
<li>EffekseerNative.h</li>
<li>EffekseerRendererNative.cpp</li>
<li>EffekseerRendererNative.h</li>
</ul>

		<p>
		これらのファイルをCocos2d-xのプロジェクトにコピーして、コンパイルする対象に追加してください。
		</p>


		<h2>使い方</h2>

<p>
<b>Samples/</b>ディレクトリにCocos2d-xでEffekseerのパーティクルエフェクトを再生するサンプルがあります。このドキュメントでは基本的な使い方しか説明しないので詳しい使い方はサンプルを見てください。
</p>

<p>
これらのサンプルには、このライブラリは含まれていないため、
それぞれのサンプルの<b>Classes/Effekseer</b>ディレクトリにライブラリのファイルをコピーしてください。
ライブラリをコピーする先のディレクトリの目印として<b>copyEffekseerFiles.txt</b>というファイルがコピーする先のディレクトリに存在します。
</p>

<h3>再生できるファイルについて</h3>

<p>
Effekseerの標準出力で保存したファイルのみ再生できます。保存されたファイルにはEffekseerのプロジェクトから画像への相対パスが含まれています。
そのため、標準出力で保存されたファイルから画像への相対パスを維持したまま、画像も配置する必要があります。
</p>

<h3>基本的な再生</h3>

<p>
Effekseerの標準出力で保存したエフェクトファイルをcocos2d-xで再生します。詳しくは<b>Samples/Simple/</b>に保存されているソースコードを見てください。
</p>

<br>

<p>
EffekseerForCocos2d-x.h(バージョン4)かEffekseer.h(バージョン3)をインクルードします。
</p>

<pre>
#if COCOS2D_VERSION >= 0x00040000
#include "EffekseerForCocos2d-x.h"
#else
#include "Effekseer/Effekseer.h"
#endif
</pre>
<br>

<p>
cocos2d::Scene、もしくはcocos2d::Layerを継承したクラスのメンバ変数にefk::EffectManager*を加えます。
</p>

<pre>
class HelloWorld : public cocos2d::Scene /*(Layer)*/ {
efk::EffectManager* manager = nullptr;
...
</pre>
<br>

<p>
efk::EffectManager*のインスタンスを生成します。
</p>

<pre>
manager = efk::EffectManager::create(Director::getInstance()->getVisibleSize());
</pre>
<br>

<p>
エフェクトファイルを読み込みます。
</p>

<pre>
auto effect = efk::Effect::create("Laser01.efk");
</pre>
<br>

<p>
エミッターを生成し、パラメーターを設定してシーンに追加します。
</p>

<pre>
auto emitter = efk::EffectEmitter::create(manager);
emitter->setEffect(effect);
emitter->setPlayOnEnter(true);

emitter->setPosition(Vec2(300, 300));
emitter->setScale(20);
this->addChild(emitter, 0);

// No need (because it uses autorelease after 1.41)
//effect->release();
</pre>

<p>
毎フレーム、マネージャーを更新します。
</p>

<pre>
manager->update();
</pre>
<br>

<p>
visitを継承して、エフェクトを実際に描画する処理を追加します。
</p>

<pre>
void HelloWorld::visit(
	cocos2d::Renderer *renderer, 
	const cocos2d::Mat4& parentTransform, 
	uint32_t parentFlags)
{
	manager->begin(renderer, _globalZOrder);
	cocos2d::Scene::visit(renderer, parentTransform, parentFlags);
	manager->end(renderer, _globalZOrder);
}
</pre>
<br>

<p>
終了時にマネージャーを破棄しましょう。
</p>

<pre>
HelloWorld::~HelloWorld()
{
	manager->release();
}
</pre>

<h3>3D</h3>

<p><b>Samples/3D/</b>のサンプルを読んでください。</p>

<p>cocos2d-xのシーンにカメラを追加する必要があります。</p>

<pre>
auto s = Director::getInstance()->getWinSize();
camera = Camera::createPerspective(60, (GLfloat)s.width / s.height, 1, 1000);
camera->setPosition3D(Vec3(100, 100, 100));
camera->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0));
camera->setCameraFlag(cocos2d::CameraFlag::USER1);
</pre>


<p>
マネージャーの更新に加えて、カメラのパラメーターをマネージャーに設定する必要があります。
</p>
		
<pre>
manager->update();
manager->setCameraMatrix(camera->getViewMatrix());
manager->setProjectionMatrix(camera->getProjectionMatrix());
</pre>

<h3>ネットワーク機能</h3>

<p>ネットワーク経由でアプリケーション(ゲーム等)で再生しているエフェクトを外部からアプリケーションの起動中に編集することができます。</p>

<img src="img/network.png" width="800">

<p>サーバーのインスタンスを作成します。そして、makeNetworkServerEnabledの引数にEffekseerから接続するためのポートを指定して、makeNetworkServerEnabledを実行します。</p>
	

<pre>
networkSever = efk::NetworkServer::create();
networkSever->makeNetworkServerEnabled(60000);
</pre>

<p>
マネージャーの更新に加えて、サーバーを更新する必要があります。そうすると、Effekseerからエフェクトを編集できるようになります。他のコンピューターからエフェクトを編集するためにはファイヤーウォールの設定でポート開放する必要があります。
</p>

<pre>
manager->update();
networkSever->update();
</pre>

		<h2>ライセンス</h2>

<p>
Effekseerを使用する場合は、ヘルプ等に以下の文面を加える必要があります。
</p>

<pre>
The MIT License (MIT)

Copyright (c) 2011 Effekseer Project

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
</pre>

<h2>更新履歴</h2>

<h3>1.52b (20/05/02)</h3>
<p>生成方法の線だとパーティクルが表示されない不具合を修正</p>

<h3>1.52a (20/04/28)</h3>
<p>約90度に回転したZ軸回転ビルボードの挙動がおかしい不具合を修正</p>

<h3>1.52 (20/04/25)</h3>
<p>クラッシュを含む様々な不具合の修正</p>

<h3>1.50 (20/03/18)</h3>
<p>cocos2d-x v4のサポート</p>
<p>様々な不具合の修正</p>

<h3>1.43c (19/09/16)</h3>
<p>PlayOnEnterがfalseで次のフレームにplayを読んだ場合にクラッシュする不具合を修正</p>
<p>プレイ中にパラメーターが反映されない不具合を修正</p>

<h3>1.43b (19/08/03)</h3>
<p>OpenGLのステートの不具合を修正</p>
<p>サンプルの修正</p>

<h3>1.43 (19/03/02)</h3>
<p>ネットワーク機能の追加</p>

<h3>1.42 (19/02/08)</h3>
<p>画像をキャッシュする機能を追加</p>
<p>ドキュメントの追加</p>
<p>0フレーム目に生成された軌跡とリボンの挙動がおかしい不具合の修正</p>
<p>SSEのバッファオーバーランでクラッシュする不具合の修正</p>
<p>色のイージングを指定したときにAndroidでクラッシュする不具合の修正</p>

<h3>1.41 (18/11/10) </h3>
<p>setRemoveOnStopを使用しているときクラッシュすることがある不具合を修正. サンプルのメモリリークを修正</p>
<p>この更新でEffectとEffectEmitterクラスはautoreleaseにより自動的に解放されるようになりました。releaseに関するコードを修正する必要があります。</p>

<p>1.40 (18/09/12) 複数の関数を追加しました。AndroidとiOSで高速化しました。3Dのサポートをしました。</p>

<p>1.30 (17/11/03) 公開しました。</p>

	</div>
</body>

</html>
